async def main(ob, args):
    if not args:
        await ob.m.tell_user(ob, 'Where do you wanna go?\n')
        return False

    dl, tl = None, None

    if args in ('e', 'east'):
        dl = (1, 0 , 0)
    elif args in ('s', 'south'):
        dl = (0, -1 , 0)
    elif args in ('w', 'west'):
        dl = (-1, 0 , 0)
    elif args in ('n', 'north'):
        dl = (0, 1 , 0)
    elif args in ('u', 'up'):
        dl = (0, 0 , 1)
    elif args in ('d', 'down'):
        dl = (0, 0 , -1)
    elif ob.m.is_location(args):
        tl = eval(args)
    elif ob.m.is_location('(' + ','.join(args.split()) + ')'):
        tl = eval('(' + ','.join(args.split()) + ')')
    else:
        await ob.m.tell_user(ob, 'go e/s/w/n/u/d, or go (x,y,z) or go x y z\n')
        return False

    location = ob.data.get('location', None)

    if tl:
        ob.data['location'] = tl
    elif not location:
        await ob.m.tell_user(ob, f"You want to go [{args}], but you can't find your bearings.\n")
        return False
    else:
        ob.data['location'] = tuple(a + b for a, b in zip(location, dl))

    src = ob.m.get_space(location)
    dst = ob.m.get_space(ob.data['location'])

    src.move_out(ob)
    await ob.m.tell_user(ob, dst.look())
    dst.move_in(ob)

    return True

